#include "trace/trace-gen.hpp"
#include "trace/trace-gen-impl.hpp"

/**
 * \file
 * \ingroup trace
 * cas::TraceGenerator implementation.
 */

namespace cas
{
    SLOG_COMPONENT_DEFINE("TraceGenerator");

    template <class T>
    BaseTask<T>::BaseTask()
    {
        SLOG_FUNCTION_NOARGS();
        status = TASK_END;
        genType = TASKGEN_DATA;
    }

    template <class T>
    BaseTask<T>::~BaseTask()
    {
        SLOG_FUNCTION_NOARGS();
    }

    TraceGenerator::TraceGenerator(const std::string &configFile)
    {
        SLOG_FUNCTION(configFile);
        if (!configFile.empty())
        {
            loadConfig(configFile);
        }
    }

    TraceGenerator::~TraceGenerator()
    {
        SLOG_FUNCTION_NOARGS();
    }

    void TraceGenerator::loadConfig(const std::string &configFile)
    {
        SLOG_FUNCTION(configFile);
        const auto config = toml::parse(configFile);
        parseConfig(config);
    }

    void TraceGenerator::loadConfig(std::istream configIstream)
    {
        SLOG_FUNCTION(typeid(configIstream).name());
        const auto config = toml::parse(configIstream);
        parseConfig(config);
    }

    void TraceGenerator::parseConfig(const toml::value &config)
    {
        SLOG_INFO("toml <- " << typeName());
        const std::string title = toml::find_or<std::string>(config, "title", "__title__");
        SLOG_INFO("├── title = " << title);
        this->title = title;
    }
}
